import { _decorator, Component, EventKeyboard, macro, systemEvent, SystemEvent } from 'cc';
import { BlockManager } from './BlockManager';
const { ccclass, property } = _decorator;

<<<<<<< HEAD
/**
 * 玩家控制器
 * 负责处理用户输入并控制游戏方块的移动
 */
@ccclass('PlayerController')
export class PlayerController extends Component {
    // 方块管理器引用
    @property(BlockManager) 
    private blockManager: BlockManager = null;
    
    /**
     * 组件初始化时调用
     * 注册键盘事件监听
     */
=======
export const BLOCK_SIZE = 40; // 添加一个放大比

@ccclass('PlayerController')
export class PlayerController extends Component {
    // 动画
    @property(Animation)
    BodyAnim:Animation = null;

    private _startJump: boolean = false;
    private _jumpStep: number = 0;
    private _curJumpTime: number = 0;
    private _jumpTime: number = 0.1;
    private _curJumpSpeed: number = 0;
    private _curPos: Vec3 = new Vec3();
    private _deltaPos: Vec3 = new Vec3(0, 0, 0);
    private _targetPos: Vec3 = new Vec3();

>>>>>>> 902b0c5bc4fb81bb5916ad28936f096b9c95ed4c
    start() {
        this.setupInputListeners();
    }
<<<<<<< HEAD
    
    /**
     * 设置输入监听器
     * 注册键盘事件处理函数
     */
    setupInputListeners() {
        // 键盘控制
        systemEvent.on(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
=======

    // update 方法会被引擎以一定的时间间隔调用，比如帧率为 30 每秒时，则每秒会调用 update 30 次
    update (deltaTime: number) {
        if (this._startJump) {
            this._curJumpTime += deltaTime; // 累计总的跳跃时间
            if (this._curJumpTime > this._jumpTime) { // 当跳跃时间是否结束
                // end 
                this.node.setPosition(this._targetPos); // 强制位置到终点
                this._startJump = false;               // 清理跳跃标记
            } else {
                // tween
                this.node.getPosition(this._curPos); 
                this._deltaPos.x = this._curJumpSpeed * deltaTime; //每一帧根据速度和时间计算位移
                Vec3.add(this._curPos, this._curPos, this._deltaPos); // 应用这个位移
                this.node.setPosition(this._curPos); // 将位移设置给角色
            }
        }
>>>>>>> 902b0c5bc4fb81bb5916ad28936f096b9c95ed4c
    }
    
    /**
     * 键盘按下事件处理
     * @param event 键盘事件对象
     */
    onKeyDown(event: EventKeyboard) {
        switch(event.keyCode) {
            case macro.KEY.left: // 左箭头键 - 向左移动方块
                this.blockManager.moveHorizontal(-1);
                break;
            case macro.KEY.right: // 右箭头键 - 向右移动方块
                this.blockManager.moveHorizontal(1);
                break;
            case macro.KEY.down: // 下箭头键 - 向下移动方块
                this.blockManager.moveDown();
                break;
            case macro.KEY.up: // 上箭头键 - 旋转方块
                this.blockManager.rotate();
                break;
            case macro.KEY.space: // 空格键 - 快速下落
                this.hardDrop();
                break;
        }
    }
<<<<<<< HEAD
    
    /**
     * 硬下落
     * 让方块直接落到底部
     */
    hardDrop() {
        while (this.blockManager.moveDown()) {
            // 继续下落直到无法移动
        }
    }
    
    /**
     * 组件销毁时调用
     * 移除事件监听，避免内存泄漏
     */
    onDestroy() {
        systemEvent.off(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
=======

    // 根据步数跳跃
    jumpByStep(step: number) {
        if (this._startJump) {
                return;
            }
        this._startJump = true;  // 标记开始跳跃
        this._jumpStep = step; // 跳跃的步数 1 或者 2
        this._curJumpTime = 0; // 重置开始跳跃的时间
        this._curJumpSpeed = this._jumpStep * BLOCK_SIZE / this._jumpTime; // 根据时间计算出速度
        this.node.getPosition(this._curPos); // 获取角色当前的位置
        // Vec3 是 三维矢量 Vector3 的缩写，这个类会提供三维矢量的存储和一些计算的方法。其中 Vec3.add 是它提供的静态方法，用于计算两个向量相加，并将结果存储在第一个参数 _targetPos 里面。
        Vec3.add(this._targetPos, this._curPos, new Vec3(this._jumpStep * BLOCK_SIZE, 0, 0));    // 计算出目标位置
    
    
        if (this.BodyAnim) {
            if (step === 1) {
                this.BodyAnim.play('oneStep');
            } else if (step === 2) {
                this.BodyAnim.play('twoStep');
            }
        }

>>>>>>> 902b0c5bc4fb81bb5916ad28936f096b9c95ed4c
    }
}


